/**
* Copyright (c) 2010-2017 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.io.homekit.internal.accessories;
import java.util.concurrent.CompletableFuture;
import org.eclipse.smarthome.core.items.GenericItem;
import org.eclipse.smarthome.core.items.GroupItem;
import org.eclipse.smarthome.core.items.ItemRegistry;
import org.eclipse.smarthome.core.library.items.SwitchItem;
import org.eclipse.smarthome.core.library.types.OnOffType;
import org.openhab.io.homekit.internal.HomekitAccessoryUpdater;
import org.openhab.io.homekit.internal.HomekitTaggedItem;
import com.beowulfe.hap.HomekitCharacteristicChangeCallback;
import com.beowulfe.hap.accessories.Switch;
/**
* Implements Switch using an Item that provides an On/Off state.
*
* @author Andy Lintner
*/
public class HomekitSwitchImpl extends AbstractHomekitAccessoryImpl<SwitchItem>implements Switch {
public HomekitSwitchImpl(HomekitTaggedItem taggedItem, ItemRegistry itemRegistry, HomekitAccessoryUpdater updater) {
super(taggedItem, itemRegistry, updater, SwitchItem.class);
}
@Override
public CompletableFuture<Boolean> getSwitchState() {
OnOffType state = (OnOffType) getItem().getStateAs(OnOffType.class);
return CompletableFuture.completedFuture(state == OnOffType.ON);
}
@Override
public CompletableFuture<Void> setSwitchState(boolean state) throws Exception {
GenericItem item = getItem();
if (item instanceof SwitchItem) {
((SwitchItem) item).send(state ? OnOffType.ON : OnOffType.OFF);
} else if (item instanceof GroupItem) {
((GroupItem) item).send(state ? OnOffType.ON : OnOffType.OFF);
}
return CompletableFuture.completedFuture(null);
}
@Override
public void subscribeSwitchState(HomekitCharacteristicChangeCallback callback) {
getUpdater().subscribe(getItem(), callback);
}
@Override
public void unsubscribeSwitchState() {
getUpdater().unsubscribe(getItem());
}
}